home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
MONITOR
/
CURSESP.ARJ
/
CURSESIO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-02
|
8KB
|
197 lines
/****************************************************************/
/* Low-level I/O functions of the PCcurses package, 'C' version */
/* */
/****************************************************************/
/* This version of curses is based on ncurses, a curses version */
/* originally written by Pavel Curtis at Cornell University. */
/* I have made substantial changes to make it run on IBM PC's, */
/* and therefore consider myself free make it public domain. */
/* Bjorn Larsson (...mcvax!enea!infovax!bl) */
/****************************************************************/
/* BUT: this particular module was written by */
/* Steve Creps (creps@silver.bacs.indiana.edu) */
/* It provides 'C' versions of the low-level I/O functions */
/* that are also available in assembler in cursesio.asm. */
/* B. Larsson took the liberty of modifying its style slightly */
/* when incorporating it into PCcurses v.1.2. */
/****************************************************************/
/* 1.0: Original, S. Creps: 880827 */
/* 1.2: Style clean-up, rcsid[] string for maintenance: 881002 */
/* 1.3: MSC -W3, Turbo'C' -w -w-pro checkes: 881005 */
/****************************************************************/
#include <curses.h>
#include <curspriv.h>
#include <dos.h>
char _curses_curseio_rcsid[] = "@(#)cursesio.c v1.3 - 881005";
static union REGS regs;
/****************************************************************/
/* _Cursescattr(void) writes char 'chr' with attributes 'attr' to */
/* the current cursor location. */
/****************************************************************/
void _cursescattr(char chr, char attr)
{
regs.h.ah = 0x09;
regs.h.al = (unsigned char)chr;
regs.h.bh = 0x00;
regs.h.bl = (unsigned char)attr;
regs.x.cx = 0x01;
int86(0x10, ®s, ®s);
} /* _cursescattr */
/****************************************************************/
/* _Cursescursor(void) sets the cursor position in video page 0. */
/* 'row' and 'column' are the cursor address. If 'row' is set */
/* to 25, no cursor at all is displayed. */
/****************************************************************/
void _cursescursor(int row, int column)
{
regs.h.ah = 0x02;
regs.h.bh = 0x00;
regs.h.dh = (unsigned char)row;
regs.h.dl = (unsigned char)column;
int86(0x10, ®s, ®s);
}/* _cursescursor */
/****************************************************************/
/* _Cursesgcols(void) returns the current number of columns on the */
/* screen. */
/****************************************************************/
int _cursesgcols(void)
{
regs.h.ah = 0x0f;
int86(0x10, ®s, ®s);
return (int)regs.h.ah;
} /* _cursesgcols */
/****************************************************************/
/* _Cursesputc(void) outputs character 'chr' to screen in tty */
/* fashion. If a colour mode is active, the character is writ- */
/* ten with colour 'colour'. */
/****************************************************************/
void _cursesputc(char chr, char color)
{
regs.h.ah = 0x0e;
regs.h.al = (unsigned char)chr;
regs.h.bh = 0x00;
regs.h.bl = (unsigned char)color;
int86(0x10, ®s, ®s);
} /* _cursesputc */
/****************************************************************/
/* _Cursesscroll(void) scrolls a window in the current page up or */
/* down. Urow, lcol, lrow,rcol are the window coordinates. */
/* Lines is the number of lines to scroll. If 0, clears the */
/* window, if < 0 scrolls down, > 0 scrolls up. Blanks areas */
/* that are left, and sets character attributes to attr. If in */
/* a colour graphics mode, fills them with the colour 'attr' */
/* instead. */
/****************************************************************/
void _cursesscroll(int urow, int lcol, int lrow, int rcol, int lines, char attr)
{
if (lines >= 0)
{
regs.h.ah = 0x06;
regs.h.al = (unsigned char)lines;
} /* if */
else
{
regs.h.ah = 0x07;
regs.h.al = (unsigned char)(-lines);
} /* else */
regs.h.bh = (unsigned char)attr;
regs.h.ch = (unsigned char)urow;
regs.h.cl = (unsigned char)lcol;
regs.h.dh = (unsigned char)lrow;
regs.h.dl = (unsigned char)rcol;
int86(0x10, ®s, ®s);
} /* _cursesscroll */
/****************************************************************/
/* _Cursesgcmode(void) returns the current cursor type. Bits 8-15 */
/* of the return value is the start scan row, and bits 0-7 is */
/* the end scan row. */
/****************************************************************/
int _cursesgcmode(void)
{
regs.h.ah = 0x03;
regs.h.bh = 0x00;
int86(0x10, ®s, ®s);
return (int)regs.x.cx;
} /* _cursesgcmode */
/****************************************************************/
/* _Cursescmode(void) sets the cursor type to begin in scan line */
/* startrow and end in scan line endrow. Both values should be */
/* 0-31. */
/****************************************************************/
void _cursescmode(int startrow, int endrow)
{
regs.h.ah = 0x01;
regs.h.ch = (unsigned char)startrow;
regs.h.cl = (unsigned char)endrow;
int86(0x10, ®s, ®s);
} /* _cursescmode */
/****************************************************************/
/* _Curseskey(void) returns the next key code struck at the key- */
/* board. If the low 8 bits are 0, the upper bits contain the */
/* extended character code. If bit 0-7 are non-zero, the upper */
/* bits = 0. */
/****************************************************************/
int _curseskey(void)
{
regs.h.ah = 0x00;
int86(0x16, ®s, ®s);
if (regs.h.al != 0)
return (int)(regs.x.ax & 0x00ff);
return (int)regs.x.ax;
} /* _curseskey */
/****************************************************************/
/* _Curseskeytst(void) returns 1 if a keyboard character is avail- */
/* able, 0 otherwise. */
/****************************************************************/
bool _curseskeytst(void)
{
regs.h.ah = 0x01;
int86(0x16, ®s, ®s);
return ((bool)((regs.x.cflag & 0x40) ? 1 : 0));
} /*_curseskeytst */
/****************************************************************/
/* _Cursesgcb(void) returns 1 if MSDOS BREAK CHECK is on, else 0. */
/****************************************************************/
int _cursesgcb(void)
{
regs.h.ah = 0x33;
regs.h.al = 0x00;
int86(0x21, ®s, ®s);
return (int)regs.h.dl;
} /* _cursesgcb */
/****************************************************************/
/* _Cursesscb(void) sets MSDOS BREAK CHECK according to 'setting'. */
/****************************************************************/
void _cursesscb(int setting)
{
regs.h.ah = 0x33;
regs.h.al = 0x00;
regs.h.dl = (unsigned char)(setting ? 1 : 0);
int86(0x21, ®s, ®s);
} /* _cursesscb */